<?php
namespace App\Services;

use App\Models\User;
use App\Models\UserPush;

/**
 *
 * 统合通知服务层（含推送，短信，邮件）
 *
 * @author maqu
 *
 */
class IntegratedNotificationService extends BaseService {

    //考虑因素：
    // 群发 or 单发 （谁）
    // 消息模板
    // 额外参数（用于模板解析或Jpush前端打开指定页面用）

    public function send($tmpl_code,$user_ids,$extra_info=null){

        if(!$user_ids || !$tmpl_code){
            return $this->failure('参数不对');
        }

        //获取消息模板
        $templates =$this->get_templates();
        if(!array_key_exists($tmpl_code,$templates)){
            return $this->failure('消息模板:'.$tmpl_code.'不存在.');
        }
        $tmpl =$templates[$tmpl_code];

        //获取用户信息
        if($tmpl['send_push']){

            $pushService = new NotificationService();
            $msg = $this->tmpl_replace($tmpl['push_template'],$extra_info);
            $pushService->sendByAlias($user_ids,$msg,$extra_info);
            unset($pushService);

            //设备标识。一次推送最多 1000 个。
        }

        if($tmpl['send_email']){
            //@TODO 发送邮件
        }
        if($tmpl['send_sms']){
            //@TODO 发送短信
            //阿里大鱼一次能发200个手机号码
        }

        unset($templates,$tmpl,$users,$users_arr);

        return $this->success(null);

    }

    private function get_templates(){

        //parameter rules:
        // 1 {$tuan_name}
        // 2 {$tusn.name}

        return [
            'tmpl_zutuan_success'=>[//组团成功(支付回调)
                'send_sms'=>0,
                'send_email'=>0,
                'send_push'=>1,
                'sms_template'=>'',
                'email_template'=>'',
                'push_template'=>'[拼美食]您拼团的 {$pintuan_short_name} 已组团成功，即将为您发货。',
            ],
            'tmpl_zutuan_failure'=>[//组团失败（定时器）
                'send_sms'=>0,
                'send_email'=>0,
                'send_push'=>1,
                'sms_template'=>'',
                'email_template'=>'',
                'push_template'=>'[拼美食]您拼团的{$pintuan_short_name}组团失败，稍后为您退款。',
            ],
            'tmpl_kaijiang_notifiy'=>[//开奖通知 仅仅通知一等奖中奖用户（定时器）
                'send_sms'=>0,
                'send_email'=>0,
                'send_push'=>1,
                'sms_template'=>'',
                'email_template'=>'',
                'push_template'=>'[拼美食]恭喜您团的{$pintuan_short_name}已中奖，我们稍后为您发货。',
            ],
            'tmpl_order_delivery'=>[//发货通知（后台）
                'send_sms'=>0,
                'send_email'=>0,
                'send_push'=>1,
                'sms_template'=>'',
                'email_template'=>'',
                'push_template'=>'[拼美食]订单:{$order_sn}已经为您发货了，请注意查收哦',
            ],

            'tmpl_order_refund_agree'=>[//同意退款（后台）
                'send_sms'=>0,
                'send_email'=>0,
                'send_push'=>1,
                'sms_template'=>'',
                'email_template'=>'',
                'push_template'=>'[拼美食]您申请的订单:{$order_sn}的退款请求已经同意，正在为您办理退款手续',
            ],
            'tmpl_order_returngoods_agree'=>[//同意退货（后台）
                'send_sms'=>0,
                'send_email'=>0,
                'send_push'=>1,
                'sms_template'=>'',
                'email_template'=>'',
                'push_template'=>'[拼美食]您申请的订单:{$order_sn}的退货请求已经同意，请您根据提示进行下步操作',
            ],
            'tmpl_order_returngoods_received'=>[//退货收货（后台）
                'send_sms'=>0,
                'send_email'=>0,
                'send_push'=>1,
                'sms_template'=>'',
                'email_template'=>'',
                'push_template'=>'您邮寄的订单:{$order_sn}的退货商品已经收到，正在为您办理退款手续',
            ],
            'tmpl_order_refund_success'=>[//退款成功（退款回调）
                'send_sms'=>0,
                'send_email'=>0,
                'send_push'=>1,
                'sms_template'=>'',
                'email_template'=>'',
                'push_template'=>'订单:{$order_sn}的{$goods_name}商品退款{$refund_price}元，已到您的账户中，请查收',
            ]
        ];
    }

    //替换模板中的模板变量
    private function tmpl_replace($tmpl_msg,$params){

        if(!$tmpl_msg){
            return $tmpl_msg;
        }

        if(!is_array($params)){
            return $tmpl_msg;
        }

        $match = array();
        preg_match_all('/{\$(.*?)}/', $tmpl_msg, $match);

        foreach($match[1] as $key => $value) {
            $tmpl_msg = str_replace($match[0][$key], array_get($params, $match[1][$key]), $tmpl_msg);
        }
        unset($match);

        return $tmpl_msg;
    }
}